home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / asm / demos / retinarave / include / promizer-replay.s < prev    next >
Text File  |  1980-01-03  |  23KB  |  1,159 lines

  1.  
  2.     section "player",code_p
  3.  
  4. ;------------------------------------------------------------------------------
  5. ;                                 TEST PLAYING
  6. ;------------------------------------------------------------------------------
  7.  
  8. testplay
  9.     bsr.w    mt_init
  10.  
  11.     lea    $dff000,a6
  12.     move.w    $1c(a6),d0
  13.     move.w    #$3fff,$9a(a6)        ;kill interupts
  14.  
  15. waitbutt
  16.     cmp.b    #-1,6(a6)
  17.     bne.b    waitbutt
  18.  
  19.     movem.l    d0/a6,-(a7)
  20.     bsr.w    mt_music
  21.     movem.l    (a7)+,d0/a6
  22.     
  23.     btst    #6,$bfe001
  24.     bne.b    waitbutt
  25.  
  26.     move.w    #$7fff,$9a(a6)
  27.     bset    #15,d0
  28.     move.w    d0,$9a(a6)
  29.  
  30.     bra.w    mt_end
  31.  
  32. ;------------------------------------------------------------------------------
  33. ;                      PROMIZER PLAYER V0.1a ... MAY 1992
  34. ;------------------------------------------------------------------------------
  35. ;                           coded by MC68000 of TECH
  36. ;                                Frank Hülsmann
  37. ;                             Timmerscheidtstr. 14
  38. ;                             4400 Münster/Germany
  39. ;------------------------------------------------------------------------------
  40. ;
  41. ; MODIFY 'mt_maxvol' (0-64 ... size : byte) TO SET MAXIMUM ABSOLUT VOLUME !!!
  42. ;
  43. ; THIS PLAYER WORKS WITH FINETUNED SAMPLES BY USING A MINIMUM OF RASTER TIME !!
  44. ; THE CODE BASED ON THE PROTRACKER V1.1b REPLAYER BY ZAP/AMIGA FREELANCERS, BUT
  45. ; IT'S MAX.400% FASTER AND FULLY PC-RELOCATIBLE ...
  46. ;
  47. ;------------------------------------------------------------------------------
  48.  
  49. mt_level6=1            ;1=level 6 interupt on (faster dmareg. init)
  50. mt_dmawaiter=3            ;no.of rasterlines waiting for dma
  51.  
  52. ; INIT_PLAYING ----------------------------------------------------------------
  53.  
  54. mt_init    movem.l    d0-a6,-(a7)
  55.     lea    mt_pm(pc),a5
  56.     move.l    mt_dataptr(pc),a0
  57.  
  58.     lea    762(a0),a1            ;patternlenght
  59.     move.l    (a1)+,d0
  60.     add.l    d0,a1                ;samplestarts
  61.             
  62.     lea    mt_samplestarts(pc),a2
  63.     moveq    #30,d1
  64. mt_samploop
  65.     moveq    #0,d0
  66.     move.w    (a0),d0                ;samplelength in words
  67.     add.l    d0,d0                ;samplelength in bytes
  68.     move.l    a1,(a2)+            ;save sample adress
  69.     add.l    d0,a1                ;next sample
  70.     addq.l    #8,a0                ;next sample info
  71.     dbf    d1,mt_samploop
  72.  
  73.     or.b    #2,$bfe001            ;filter off
  74.     move.b    #6,mt_speed-mt_pm(a5)
  75.     clr.b    mt_counter-mt_pm(a5)
  76.     clr.w    mt_songpos-mt_pm(a5)
  77.     clr.w    mt_patternpos-mt_pm(a5)
  78.     move.l    $78.w,mt_oldirq-mt_pm(a5)    ;save old_irq
  79.     lea    $dff096,a0
  80.     clr.w    $a8-$96(a0)
  81.     clr.w    $b8-$96(a0)
  82.     clr.w    $c8-$96(a0)
  83.     clr.w    $d8-$96(a0)            ;volume voice 1-4 = 0
  84.     moveq    #$f,d0
  85.     move.w    d0,(a0)                ;no sound_dma
  86.  
  87. ; CREATE PERIOD MULTAB (FOR FASTER FINE_TUNING)
  88.  
  89.     moveq    #15,d7
  90.     moveq    #0,d0
  91.     moveq    #72,d1
  92. mt_mulloop2
  93.     move.w    d0,(a5)+
  94.     add.w    d1,d0
  95.     dbf    d7,mt_mulloop2
  96.  
  97. ; CALCULATE RELATIVE JUMP ADRESSES IN JUMPTABS (FOR PC-COMPATIBLE CODE !!!)
  98.  
  99.     lea    mt_init(pc),a0
  100.     move.l    a0,d0
  101.     lea    mt_jumptab1(pc),a0
  102.     lea    mt_jumptab2(pc),a1
  103.     lea    mt_jumptab3(pc),a2
  104.     lea    mt_jumptab4(pc),a3
  105.     moveq    #15,d1
  106. mt_jumpcalcloop
  107.     add.l    d0,(a0)+
  108.     add.l    d0,(a1)+
  109.     add.l    d0,(a2)+
  110.     add.l    d0,(a3)+
  111.     dbf    d1,mt_jumpcalcloop
  112.  
  113.     if mt_level6=1
  114.     lea    mt_irqpointer(pc),a0
  115.     add.l    d0,(a0)
  116.     endc
  117.     
  118.     movem.l    (a7)+,d0-a6
  119.     rts
  120.  
  121. ; END_PLAYING -----------------------------------------------------------------
  122.  
  123. mt_end    movem.l    d0/a0,-(a7)
  124.     move.l    mt_oldirq(pc),$78.w
  125.     lea    $dff096,a0
  126.     clr.w    $a8-$96(a0)
  127.     clr.w    $b8-$96(a0)
  128.     clr.w    $c8-$96(a0)
  129.     clr.w    $d8-$96(a0)
  130.     moveq    #$f,d0
  131.     move.w    d0,(a0)
  132.     movem.l    (a7)+,d0/a0
  133.     rts
  134.  
  135. ; SOUND_PLAYER ---------------------------------------------------------------
  136.  
  137. ; kills d0-d7/a0-a6 !!!!
  138.  
  139. mt_music
  140.     moveq    #$f,d5                ;ander com_low
  141.     moveq    #-16,d6                ;ander com    
  142.     lea    mt_pm(pc),a2
  143.  
  144.     addq.b    #1,mt_counter-mt_pm(a2)
  145.     move.b    mt_counter-mt_pm(a2),d0
  146.     cmp.b    mt_speed-mt_pm(a2),d0
  147.     blo.b    mt_nonewallchannels
  148.     clr.b    mt_counter-mt_pm(a2)
  149.     tst.b    mt_pattdeltime2-mt_pm(a2)
  150.     beq.b    mt_getnewnote
  151.     bsr.b    mt_nonewallchannels
  152.     bra.w    mt_dskip
  153.  
  154. mt_nonewallchannels
  155.     lea    $dff0a0,a5
  156.     lea    mt_chan1temp(pc),a6
  157.     bsr.w    mt_checkefx
  158.     lea    $10(a5),a5
  159.     lea    48(a6),a6
  160.     bsr.w    mt_checkefx
  161.     lea    $10(a5),a5
  162.     lea    48(a6),a6
  163.     bsr.w    mt_checkefx
  164.     lea    $10(a5),a5
  165.     lea    48(a6),a6
  166.     bsr.w    mt_checkefx
  167.     bra.w    mt_nonewposyet
  168.  
  169. mt_getnewnote
  170.     move.l    mt_dataptr(pc),a0
  171.     move.l    a0,a3                ;sample infos
  172.     lea    250(a0),a4            ;patterpositions
  173.     lea    766(a0),a0            ;patterndata
  174.     moveq    #0,d1
  175.     move.w    mt_songpos(pc),d0
  176.     move.l    (a4,d0.w),d1
  177.     add.w    mt_patternpos(pc),d1
  178.  
  179.     clr.w    mt_dmacontemp-mt_pm(a2)
  180.  
  181.     lea    $dff0a0,a5
  182.     lea    mt_chan1temp(pc),a6
  183.     bsr.b    mt_playvoice
  184.     lea    $10(a5),a5
  185.     lea    48(a6),a6
  186.     bsr.b    mt_playvoice
  187.     lea    $10(a5),a5
  188.     lea    48(a6),a6
  189.     bsr.b    mt_playvoice
  190.     lea    $10(a5),a5
  191.     lea    48(a6),a6
  192.     bsr.b    mt_playvoice
  193.     bra.w    mt_setdma
  194.  
  195. mt_playvoice
  196.     tst.l    (a6)
  197.     bne.b    mt_plvskip
  198.     bsr.w    mt_pernop
  199. mt_plvskip
  200.     move.l    (a0,d1.l),d2
  201.     eor.l    d6,d2
  202.     move.l    d2,(a6)
  203.     addq.l    #4,d1
  204.     moveq    #0,d2
  205.     move.l    d2,d3
  206.     move.b    2(a6),d2
  207.     lsr.b    #4,d2
  208.     move.b    (a6),d0
  209.     and.b    d6,d0
  210.     or.b    d0,d2
  211.     beq.w    mt_setregs
  212.     lea    mt_samplestarts(pc),a1
  213.     subq.w    #1,d2
  214.     lsl.w    #2,d2
  215.     move.w    d2,d4
  216.     add.w    d4,d4    
  217.     move.w    (a3,d4.w),8(a6)
  218.     move.w    (a3,d4.w),40(a6)        ;sample lenght in words
  219.     move.l    (a1,d2.w),4(a6)            ;sample adress
  220.  
  221.     moveq    #0,d0
  222.     move.b    2(a3,d4.w),d0
  223.     move.b    d0,18(a6)            ;set finetune number
  224.     add.w    d0,d0
  225.     move.w    (a2,d0.w),d0
  226.     lea    mt_periodtable(pc),a4
  227.     add.l    d0,a4
  228.     move.l    a4,44(a6)            ;save periodtable
  229.  
  230.  
  231.     move.b    3(a3,d4.w),d0            ;sample volume
  232.     cmp.b    mt_maxvol(pc),d0
  233.     bls.b    mt_nv
  234.     move.b    mt_maxvol(pc),d0        ;cut volume -> no relative
  235. mt_nv                        ;calculation here ...
  236.     move.b    d0,19(a6)
  237.  
  238.     move.w    4(a3,d4.w),d3             ;get repeat
  239.     beq.b    mt_noloop
  240.     move.l    4(a6),d2            ;get start
  241.     add.w    d3,d3
  242.     add.l    d3,d2                ;add repeat
  243.     move.l    d2,10(a6)
  244.     move.l    d2,36(a6)
  245.     move.w    4(a3,d4.w),d0            ;get repeat
  246.     add.w    6(a3,d4.w),d0            ;add replen
  247.     move.w    d0,8(a6)
  248.     move.w    6(a3,d4.w),14(a6)        ;save replen
  249.     move.b    19(a6),9(a5)            ;init volume
  250.     bra.b    mt_setregs
  251. mt_noloop
  252.     move.l    4(a6),d2
  253.     add.l    d3,d2
  254.     move.l    d2,10(a6)
  255.     move.l    d2,36(a6)
  256.     move.w    6(a3,d4.w),14(a6)        ;save replen
  257.     move.b    19(a6),9(a5)
  258. mt_setregs
  259.     move.w    (a6),d0
  260.     and.w    #$0fff,d0
  261.     beq.w    mt_checkmoreefx            ;if no note
  262.     move.w    2(a6),d0
  263.     and.w    #$0ff0,d0
  264.     cmp.w    #$0e50,d0
  265.     beq.b    mt_dosetfinetune
  266.     moveq    #0,d0
  267.     move.b    2(a6),d0
  268.     and.b    d5,d0
  269.     lsl.b    #2,d0
  270.     move.l    mt_jumptab3(pc,d0.w),a4
  271.     jmp    (a4)
  272.  
  273. mt_jumptab3    
  274.     dcb.l    3,mt_setperiod-mt_init
  275.     dc.l    mt_chktoneporta-mt_init,mt_setperiod-mt_init
  276.     dc.l    mt_chktoneporta-mt_init
  277.     dcb.l    3,mt_setperiod-mt_init
  278.     dc.l    mt_moreplusperiod-mt_init
  279.     dcb.l    7,mt_setperiod-mt_init
  280.  
  281. mt_moreplusperiod
  282.     bsr.w    mt_checkmoreefx
  283.     bra.b    mt_setperiod
  284.  
  285. mt_dosetfinetune
  286.     bsr.w    mt_setfinetune
  287.     bra.b    mt_setperiod
  288.  
  289. mt_chktoneporta
  290.     bsr.w    mt_settoneporta
  291.     bra.w    mt_checkmoreefx
  292.  
  293. mt_setperiod
  294.     move.w    (a6),d2
  295.     and.w    #$0fff,d2        ; period 'ausanden'
  296.     move.w    d2,16(a6)        ; set normal period
  297.     move.w    2(a6),d0
  298.     and.w    #$0ff0,d0
  299.     cmp.w    #$0ed0,d0         ; notedelay
  300.     beq.w    mt_checkmoreefx
  301.  
  302.     move.w    20(a6),$dff096
  303.     btst    #2,30(a6)
  304.     bne.b    mt_vibnoc
  305.     clr.b    27(a6)
  306. mt_vibnoc
  307.     btst    #6,30(a6)
  308.     bne.b    mt_trenoc
  309.     clr.b    29(a6)
  310. mt_trenoc
  311.     move.l    4(a6),(a5)        ; init start
  312.     move.w    8(a6),4(a5)        ; init length
  313.     move.w    16(a6),6(a5)        ; init period
  314.     
  315.     move.w    20(a6),d0
  316.     or.w    d0,mt_dmacontemp-mt_pm(a2)
  317.     bra.w    mt_checkmoreefx
  318.  
  319. mt_setdma
  320.     if mt_level6=0
  321.     bsr.w    mt_dmawait
  322.     move.w    mt_dmacontemp(pc),d0
  323.     or.w    #$8000,d0
  324.     move.w    d0,$dff096
  325.     bsr.w    mt_dmawait
  326.     lea    $dff0a0,a5
  327.     lea    mt_chan1temp(pc),a6
  328.     move.l    10(a6),(a5)
  329.     move.w    14(a6),4(a5)
  330.     move.l    58(a6),$10(a5)
  331.     move.w    62(a6),$14(a5)
  332.     move.l    106(a6),$20(a5)
  333.     move.w    110(a6),$24(a5)
  334.     move.l    154(a6),$30(a5)
  335.     move.w    158(a6),$34(a5)
  336.     else
  337.  
  338.     lea    $bfd000,a3
  339.     move.b    #$7f,$d00(a3)
  340.     move.w    #$2000,$dff09c
  341.     move.w    #$a000,$dff09a
  342.     lea    mt_irq1(pc),a4
  343.     move.l    a4,$78.w
  344.     moveq    #0,d0
  345.     move.b    d0,$e00(a3)
  346.     move.b    #$a8,$400(a3)
  347.     move.b    d0,$500(a3)
  348.     move.b    #$11,$e00(a3)
  349.     move.b    #$81,$d00(a3)
  350.     or.w    #$8000,mt_dmacontemp-mt_pm(a2)
  351.     bra.w    mt_dskip
  352.  
  353.  
  354. mt_irq1
  355.     tst.b    $bfdd00
  356.     move.w    mt_dmacontemp(pc),$dff096
  357.     move.w    #$2000,$dff09c
  358.     move.l    mt_irqpointer(pc),$78.w
  359.     rte
  360.  
  361. mt_irqpointer    dc.l    mt_irq2-mt_init
  362.  
  363. mt_irq2
  364.     tst.b    $bfdd00
  365.     movem.l    a5-a6,-(a7)
  366.  
  367.     lea    $dff0a0,a5
  368.     lea    mt_chan1temp(pc),a6
  369.     move.l    10(a6),(a5)
  370.     move.w    14(a6),4(a5)
  371.     move.l    58(a6),$10(a5)
  372.     move.w    62(a6),$14(a5)
  373.     move.l    106(a6),$20(a5)
  374.     move.w    110(a6),$24(a5)
  375.     move.l    154(a6),$30(a5)
  376.     move.w    158(a6),$34(a5)
  377.     clr.b    $bfde00
  378.     move.b    #$7f,$bfdd00
  379.     move.w    #$2000,$dff09c
  380.     movem.l    (a7)+,a5-a6
  381.     rte
  382.     endc
  383.  
  384. mt_dskip
  385.     add.w    #16,mt_patternpos-mt_pm(a2)
  386.     move.b    mt_pattdeltime(pc),d0
  387.     beq.b    mt_dskc
  388.     move.b    d0,mt_pattdeltime2-mt_pm(a2)
  389.     clr.b    mt_pattdeltime-mt_pm(a2)
  390. mt_dskc    tst.b    mt_pattdeltime2-mt_pm(a2)
  391.     beq.b    mt_dska
  392.     subq.b    #1,mt_pattdeltime2-mt_pm(a2)
  393.     beq.b    mt_dska
  394.     sub.w    #16,mt_patternpos-mt_pm(a2)
  395. mt_dska    tst.b    mt_pbreakflag-mt_pm(a2)
  396.     beq.b    mt_nnpysk
  397.     sf    mt_pbreakflag-mt_pm(a2)
  398.     moveq    #0,d0
  399.     move.b    mt_pbreakpos(pc),d0
  400.     clr.b    mt_pbreakpos-mt_pm(a2)
  401.     lsl.w    #4,d0
  402.     move.w    d0,mt_patternpos-mt_pm(a2)
  403. mt_nnpysk
  404.     cmp.w    #1024,mt_patternpos-mt_pm(a2)
  405.     blo.b    mt_nonewposyet
  406. mt_nextposition    
  407.     moveq    #0,d0
  408.     move.b    mt_pbreakpos(pc),d0
  409.     lsl.w    #4,d0
  410.     move.w    d0,mt_patternpos-mt_pm(a2)
  411.     clr.b    mt_pbreakpos-mt_pm(a2)
  412.     clr.b    mt_posjumpflag-mt_pm(a2)
  413.     addq.w    #4,mt_songpos-mt_pm(a2)
  414.     and.w    #511,mt_songpos-mt_pm(a2)
  415.     move.w    mt_songpos(pc),d1
  416.     move.l    mt_dataptr(pc),a0
  417.     cmp.w    248(a0),d1
  418.     blo.b    mt_nonewposyet
  419.     clr.w    mt_songpos-mt_pm(a2)
  420. mt_nonewposyet    
  421.     tst.b    mt_posjumpflag-mt_pm(a2)
  422.     bne.b    mt_nextposition
  423.     rts
  424.  
  425. mt_checkefx
  426.     bsr.w    mt_updatefunk
  427.     move.w    2(a6),d0
  428.     and.w    #$0fff,d0
  429.     beq.b    mt_pernop
  430.     moveq    #0,d0
  431.     move.b    2(a6),d0
  432.     and.b    d5,d0
  433.     move.w    d0,d2
  434.     lsl.b    #2,d2    
  435.     move.l    mt_jumptab1(pc,d2.w),a4
  436.     jmp    (a4)
  437.  
  438. mt_jumptab1
  439.     dc.l    mt_arpeggio-mt_init,mt_portaup-mt_init,mt_portadown-mt_init
  440.     dc.l    mt_toneportamento-mt_init
  441.     dc.l    mt_vibrato-mt_init,mt_toneplusvolslide-mt_init
  442.     dc.l    mt_vibratoplusvolslide-mt_init
  443.     dcb.l    7,mt_setback-mt_init
  444.     dc.l    mt_e_commands-mt_init,mt_setback-mt_init
  445.  
  446. mt_setback    
  447.     move.w    16(a6),6(a5)
  448.     subq.b    #7,d0
  449.     beq.w    mt_tremolo
  450.     subq.b    #3,d0
  451.     beq.w    mt_volumeslide
  452. mt_return2
  453.     rts
  454.  
  455. mt_pernop
  456.     move.w    16(a6),6(a5)
  457.     rts
  458.  
  459. mt_arpeggio
  460.     moveq    #0,d0
  461.     move.b    mt_counter(pc),d0
  462.     moveq    #3,d2
  463.     divs    d2,d0
  464.     swap    d0
  465.     tst.w    d0
  466.     beq.b    mt_arpeggio2
  467.     subq.w    #2,d0
  468.     beq.b    mt_arpeggio1
  469.     moveq    #0,d0
  470.     move.b    3(a6),d0
  471.     lsr.b    #4,d0
  472.     bra.b    mt_arpeggio3
  473.  
  474. mt_arpeggio1
  475.     moveq    #0,d0
  476.     move.b    3(a6),d0
  477.     and.b    d5,d0
  478.     bra.b    mt_arpeggio3
  479.  
  480. mt_arpeggio2
  481.     move.w    16(a6),d2
  482.     bra.b    mt_arpeggio4
  483.  
  484. mt_arpeggio3
  485.     add.w    d0,d0
  486.     move.l    44(a6),a0
  487.     moveq    #36,d7
  488. mt_arploop
  489.     move.w    (a0,d0.w),d2
  490.     cmp.w    (a0),d1
  491.     bhs.b    mt_arpeggio4
  492.     addq.l    #2,a0
  493.     dbf    d7,mt_arploop
  494.     rts
  495.  
  496. mt_arpeggio4
  497.     move.w    d2,6(a5)
  498.     rts
  499.  
  500. mt_fineportaup
  501.     tst.b    mt_counter-mt_pm(a2)
  502.     bne.b    mt_return2
  503.     move.b    d1,mt_lowmask-mt_pm(a2)
  504. mt_portaup
  505.     moveq    #0,d0
  506.     move.b    3(a6),d0
  507.     and.b    mt_lowmask(pc),d0
  508.     move.b    #$ff,mt_lowmask-mt_pm(a2)
  509.     sub.w    d0,16(a6)
  510.     move.w    16(a6),d0
  511.     and.w    #$0fff,d0
  512.     cmp.w    #113,d0
  513.     bhi.b    mt_portauskip
  514.     and.w    #$f000,16(a6)
  515.     or.w    #113,16(a6)
  516. mt_portauskip
  517.     move.w    16(a6),d0
  518.     and.w    #$0fff,d0
  519.     move.w    d0,6(a5)
  520.     rts    
  521.  
  522. mt_fineportadown
  523.     tst.b    mt_counter-mt_pm(a2)
  524.     bne.w    mt_return2
  525.     move.b    d5,mt_lowmask-mt_pm(a2)
  526. mt_portadown
  527.     moveq    #0,d0
  528.     move.b    3(a6),d0
  529.     and.b    mt_lowmask(pc),d0
  530.     move.b    #$ff,mt_lowmask-mt_pm(a2)
  531.     add.w    d0,16(a6)
  532.     move.w    16(a6),d0
  533.     and.w    #$0fff,d0
  534.     cmp.w    #856,d0
  535.     blo.b    mt_portadskip
  536.     and.w    #$f000,16(a6)
  537.     or.w    #856,16(a6)
  538. mt_portadskip
  539.     move.w    16(a6),d0
  540.     and.w    #$0fff,d0
  541.     move.w    d0,6(a5)
  542.     rts
  543.  
  544. mt_settoneporta
  545.     move.w    (a6),d2
  546.     and.w    #$0fff,d2
  547.     move.l    44(a6),a4
  548.     moveq    #0,d0
  549. mt_stploop
  550.     cmp.w    (a4,d0.w),d2
  551.     bhs.b    mt_stpfound
  552.     addq.w    #2,d0
  553.     cmp.w    #37*2,d0
  554.     blo.b    mt_stploop
  555.     moveq    #35*2,d0
  556. mt_stpfound
  557.     move.b    18(a6),d2
  558.     and.b    #8,d2
  559.     beq.b    mt_stpgoss
  560.     tst.w    d0
  561.     beq.b    mt_stpgoss
  562.     subq.w    #2,d0
  563. mt_stpgoss
  564.     move.w    (a4,d0.w),d2
  565.     move.w    d2,24(a6)
  566.     move.w    16(a6),d0
  567.     clr.b    22(a6)
  568.     cmp.w    d0,d2
  569.     beq.b    mt_cleartoneporta
  570.     bge.w    mt_return2
  571.     move.b    #1,22(a6)
  572.     rts
  573.  
  574. mt_cleartoneporta
  575.     clr.w    24(a6)
  576.     rts
  577.  
  578. mt_toneportamento
  579.     move.b    3(a6),d0
  580.     beq.b    mt_toneportnochange
  581.     move.b    d0,23(a6)
  582.     clr.b    3(a6)
  583. mt_toneportnochange
  584.     tst.w    24(a6)
  585.     beq.w    mt_return2
  586.     moveq    #0,d0
  587.     move.b    23(a6),d0
  588.     tst.b    22(a6)
  589.     bne.b    mt_toneportaup
  590. mt_toneportadown
  591.     add.w    d0,16(a6)
  592.     move.w    24(a6),d0
  593.     cmp.w    16(a6),d0
  594.     bgt.b    mt_toneportasetper
  595.     move.w    24(a6),16(a6)
  596.     clr.w    24(a6)
  597.     bra.b    mt_toneportasetper
  598.  
  599. mt_toneportaup
  600.     sub.w    d0,16(a6)
  601.     move.w    24(a6),d0
  602.     cmp.w    16(a6),d0
  603.     blt.b    mt_toneportasetper
  604.     move.w    24(a6),16(a6)
  605.     clr.w    24(a6)
  606.  
  607. mt_toneportasetper
  608.     move.w    16(a6),d2
  609.     move.b    31(a6),d0
  610.     and.b    d5,d0
  611.     beq.b    mt_glissskip
  612.  
  613.     move.l    44(a6),a0
  614.     moveq    #35,d7
  615. mt_glissloop
  616.     cmp.w    (a0)+,d2
  617.     bge.b    mt_glissfound
  618.     dbf    d7,mt_glissloop
  619.     subq.l    #2,a0
  620. mt_glissfound
  621.     move.w    -2(a0),d2
  622. mt_glissskip
  623.     move.w    d2,6(a5)         ; set period
  624.     rts
  625.  
  626. mt_vibrato
  627.     move.b    3(a6),d0
  628.     beq.b    mt_vibrato2
  629.     move.b    26(a6),d2
  630.     and.b    d5,d0
  631.     beq.b    mt_vibskip
  632.     and.b    d6,d2
  633.     or.b    d0,d2
  634. mt_vibskip
  635.     move.b    3(a6),d0
  636.     and.b    d6,d0
  637.     beq.b    mt_vibskip2
  638.     and.b    d5,d2
  639.     or.b    d0,d2
  640. mt_vibskip2
  641.     move.b    d2,26(a6)
  642. mt_vibrato2
  643.     move.b    27(a6),d0
  644.     lea    mt_vibratotable(pc),a4
  645.     lsr.w    #2,d0
  646.     and.w    #$001f,d0
  647.     moveq    #0,d2
  648.     move.b    30(a6),d2
  649.     and.b    #$03,d2
  650.     beq.b    mt_vib_sine
  651.     lsl.b    #3,d0
  652.     cmp.b    #1,d2
  653.     beq.b    mt_vib_rampdown
  654.     moveq    #-1,d2
  655.     bra.b    mt_vib_set
  656. mt_vib_rampdown
  657.     tst.b    27(a6)
  658.     bpl.b    mt_vib_rampdown2
  659.     moveq    #-1,d2
  660.     sub.b    d0,d2
  661.     bra.b    mt_vib_set
  662. mt_vib_rampdown2
  663.     move.b    d0,d2
  664.     bra.b    mt_vib_set
  665. mt_vib_sine
  666.     move.b    (a4,d0.w),d2
  667. mt_vib_set
  668.     move.b    26(a6),d0
  669.     and.w    d5,d0
  670.     mulu    d0,d2
  671.     lsr.w    #7,d2
  672.     move.w    16(a6),d0
  673.     tst.b    27(a6)
  674.     bmi.b    mt_vibratoneg
  675.     add.w    d2,d0
  676.     bra.b    mt_vibrato3
  677. mt_vibratoneg
  678.     sub.w    d2,d0
  679. mt_vibrato3
  680.     move.w    d0,6(a5)
  681.     move.b    26(a6),d0
  682.     lsr.w    #2,d0
  683.     and.w    #$003c,d0
  684.     add.b    d0,27(a6)
  685.     rts
  686.  
  687. mt_toneplusvolslide
  688.     bsr.w    mt_toneportnochange
  689.     bra.w    mt_volumeslide
  690.  
  691. mt_vibratoplusvolslide
  692.     bsr.b    mt_vibrato2
  693.     bra.w    mt_volumeslide
  694.  
  695. mt_tremolo
  696.     move.b    3(a6),d0
  697.     beq.b    mt_tremolo2
  698.     move.b    28(a6),d2
  699.     and.b    d5,d0
  700.     beq.b    mt_treskip
  701.     and.b    d6,d2
  702.     or.b    d0,d2
  703. mt_treskip
  704.     move.b    3(a6),d0
  705.     and.b    d6,d0
  706.     beq.b    mt_treskip2
  707.     and.b    d5,d2
  708.     or.b    d0,d2
  709. mt_treskip2
  710.     move.b    d2,28(a6)
  711. mt_tremolo2
  712.     move.b    29(a6),d0
  713.     lea    mt_vibratotable(pc),a4
  714.     lsr.w    #2,d0
  715.     moveq    #$1f,d2
  716.     and.w    d2,d0
  717.     move.b    30(a6),d2
  718.     and.w    d6,d2
  719.     lsr.b    #4,d2
  720.     and.b    #$03,d2
  721.     beq.b    mt_tre_sine
  722.     lsl.b    #3,d0
  723.     cmp.b    #1,d2
  724.     beq.b    mt_tre_rampdown
  725.     moveq    #-1,d2
  726.     bra.b    mt_tre_set
  727. mt_tre_rampdown
  728.     tst.b    27(a6)
  729.     bpl.b    mt_tre_rampdown2
  730.     moveq    #-1,d2
  731.     sub.b    d0,d2
  732.     bra.b    mt_tre_set
  733. mt_tre_rampdown2
  734.     move.b    d0,d2
  735.     bra.b    mt_tre_set
  736. mt_tre_sine
  737.     move.b    (a4,d0.w),d2
  738. mt_tre_set
  739.     move.b    28(a6),d0
  740.     and.w    d5,d0
  741.     mulu    d0,d2
  742.     lsr.w    #6,d2
  743.     moveq    #0,d0
  744.     move.b    19(a6),d0
  745.     tst.b    29(a6)
  746.     bmi.b    mt_tremoloneg
  747.     add.w    d2,d0
  748.     bra.b    mt_tremolo3
  749. mt_tremoloneg
  750.     sub.w    d2,d0
  751. mt_tremolo3
  752.     bpl.b    mt_tremoloskip
  753.     moveq    #0,d0
  754. mt_tremoloskip
  755.     cmp.b    mt_maxvol(pc),d0
  756.     bls.b    mt_tremolook
  757.     move.b    mt_maxvol(pc),d0
  758. mt_tremolook
  759.     move.b    d0,9(a5)
  760.     move.b    28(a6),d0
  761.     lsr.w    #2,d0
  762.     and.w    #$003c,d0
  763.     add.b    d0,29(a6)
  764.     rts
  765.  
  766. mt_sampleoffset
  767.     moveq    #0,d0
  768.     move.b    3(a6),d0
  769.     beq.b    mt_sononew
  770.     move.b    d0,32(a6)
  771. mt_sononew
  772.     move.b    32(a6),d0
  773.     lsl.w    #7,d0
  774.     cmp.w    8(a6),d0
  775.     bge.b    mt_sofskip
  776.     sub.w    d0,8(a6)
  777.     add.w    d0,d0
  778.     add.l    d0,4(a6)
  779.     rts
  780. mt_sofskip
  781.     move.w    #1,8(a6)
  782.     rts
  783.  
  784. mt_volumeslide
  785.     move.b    3(a6),d0
  786.     lsr.b    #4,d0
  787.     beq.b    mt_volslidedown
  788. mt_volslideup
  789.     add.b    d0,19(a6)
  790.     move.b    mt_maxvol(pc),d2
  791.     cmp.b    19(a6),d2
  792.     bge.b    mt_vsuskip
  793.     move.b    d2,19(a6)
  794. mt_vsuskip
  795.     move.b    19(a6),9(a5)
  796.     rts
  797.  
  798. mt_volslidedown
  799.     move.b    3(a6),d0
  800.     and.b    d5,d0
  801. mt_volslidedown2
  802.     sub.b    d0,19(a6)
  803.     bpl.b    mt_vsdskip
  804.     clr.b    19(a6)
  805. mt_vsdskip
  806.     move.b    19(a6),9(a5)
  807.     rts
  808.  
  809. mt_positionjump
  810.     moveq    #0,d0
  811.     move.b    3(a6),d0
  812.     subq.b    #1,d0
  813.     lsl.w    #2,d0
  814.     move.w    d0,mt_songpos-mt_pm(a2)
  815. mt_pj2    clr.b    mt_pbreakpos-mt_pm(a2)
  816.     st     mt_posjumpflag-mt_pm(a2)
  817.     rts
  818.  
  819. mt_volumechange
  820.     move.b    3(a6),d0
  821.     cmp.b    mt_maxvol(pc),d0
  822.     ble.b    mt_volumeok
  823.     move.b    mt_maxvol(pc),d0
  824. mt_volumeok
  825.     move.b    d0,19(a6)
  826.     move.b    d0,9(a5)
  827.     rts
  828.  
  829. mt_patternbreak
  830.     move.b    3(a6),d0
  831.     move.b    d0,d2
  832.     lsr.b    #4,d0
  833.     move.b    d0,d1
  834.     add.b    d0,d0        ;*2
  835.     lsl.b    #3,d1        ;*8
  836.     add.b    d1,d0        ;+ -> *10
  837.     and.b    d5,d2
  838.     add.b    d2,d0
  839.     cmp.b    #63,d0
  840.     bhi.b    mt_pj2
  841.     move.b    d0,mt_pbreakpos-mt_pm(a2)
  842.     st    mt_posjumpflag-mt_pm(a2)
  843.     rts
  844.  
  845. mt_setspeed
  846.     move.b    3(a6),d0
  847.     beq.w    mt_return2
  848.     clr.b    mt_counter-mt_pm(a2)
  849.     move.b    d0,mt_speed-mt_pm(a2)
  850.     rts
  851.  
  852. mt_checkmoreefx
  853.     bsr.w    mt_updatefunk
  854.     moveq    #0,d0
  855.     move.b    2(a6),d0
  856.     and.b    d5,d0
  857.     lsl.b    #2,d0
  858.     move.l    mt_jumptab4(pc,d0.w),a4
  859.     jmp    (a4)
  860.  
  861. mt_jumptab4    
  862.     dcb.l    9,mt_pernop-mt_init
  863.     dc.l    mt_sampleoffset-mt_init,mt_pernop-mt_init
  864.     dc.l    mt_positionjump-mt_init
  865.     dc.l    mt_volumechange-mt_init,mt_patternbreak-mt_init
  866.     dc.l    mt_e_commands-mt_init,mt_setspeed-mt_init,mt_pernop-mt_init
  867.  
  868. mt_e_commands
  869.     moveq    #0,d0
  870.     move.b    3(a6),d0
  871.     lsr.b    #4,d0
  872.     lsl.b    #2,d0
  873.     move.l    mt_jumptab2(pc,d0.w),a4
  874.     jmp    (a4)
  875.  
  876. mt_jumptab2    
  877.     dc.l    mt_filteronoff-mt_init,mt_fineportaup-mt_init
  878.     dc.l    mt_fineportadown-mt_init
  879.     dc.l    mt_setglisscontrol-mt_init,mt_setvibratocontrol-mt_init
  880.     dc.l    mt_setfinetune-mt_init
  881.     dc.l    mt_jumploop-mt_init,mt_settremolocontrol-mt_init
  882.     dc.l    mt_return2-mt_init,mt_retrignote-mt_init
  883.     dc.l    mt_volumefineup-mt_init
  884.     dc.l    mt_volumefinedown-mt_init,mt_notecut-mt_init
  885.     dc.l    mt_notedelay-mt_init
  886.     dc.l    mt_patterndelay-mt_init,mt_funkit-mt_init
  887.  
  888. mt_filteronoff
  889.     move.b    3(a6),d0
  890.     and.b    #1,d0
  891.     add.w    d0,d0
  892.     and.b    #$fd,$bfe001
  893.     or.b    d0,$bfe001
  894.     rts    
  895.  
  896. mt_setglisscontrol
  897.     move.b    3(a6),d0
  898.     and.b    d5,d0
  899.     and.b    d6,31(a6)
  900.     or.b    d0,31(a6)
  901.     rts
  902.  
  903. mt_setvibratocontrol
  904.     move.b    3(a6),d0
  905.     and.b    d5,d0
  906.     and.b    d6,30(a6)
  907.     or.b    d0,30(a6)
  908.     rts
  909.  
  910. mt_setfinetune
  911.     moveq    #0,d0
  912.     move.b    3(a6),d0
  913.     and.b    d5,d0
  914.     move.b    d0,18(a6)
  915.     add.w    d0,d0
  916.     move.w    (a2,d0.w),d0
  917.     lea    mt_periodtable(pc),a4
  918.     add.l    d0,a4
  919.     move.l    a4,44(a6)
  920.     rts
  921.  
  922. mt_jumploop
  923.     move.b    mt_counter(pc),d1
  924.     bne.w    mt_return2
  925.     move.b    3(a6),d0
  926.     and.b    d5,d0
  927.     beq.b    mt_setloop
  928.     tst.b    34(a6)
  929.     beq.b    mt_jumpcnt
  930.     subq.b    #1,34(a6)
  931.     beq.w    mt_return2
  932. mt_jmploop    
  933.     move.b    33(a6),mt_pbreakpos-mt_pm(a2)
  934.     st    mt_pbreakflag-mt_pm(a2)
  935.     rts
  936.  
  937. mt_jumpcnt
  938.     move.b    d0,34(a6)
  939.     bra.b    mt_jmploop
  940.  
  941. mt_setloop
  942.     move.w    mt_patternpos(pc),d0
  943.     lsr.w    #4,d0
  944.     move.b    d0,33(a6)
  945.     rts
  946.  
  947. mt_settremolocontrol
  948.     move.b    3(a6),d0
  949.     and.b    d5,d0
  950.     lsl.b    #4,d0
  951.     and.b    d5,30(a6)
  952.     or.b    d0,30(a6)
  953.     rts
  954.  
  955. mt_retrignote
  956.     move.b    3(a6),d0
  957.     and.b    d5,d0
  958.     beq.b    mt_rtnend
  959.     moveq    #0,d2
  960.     move.b    mt_counter(pc),d2
  961.     bne.b    mt_rtnskp
  962.     move.w    (a6),d2
  963.     and.w    #$0fff,d2
  964.     bne.b    mt_rtnend
  965.     moveq    #0,d2
  966.     move.b    mt_counter(pc),d2
  967. mt_rtnskp
  968.     divu    d0,d2
  969.     swap    d2
  970.     tst.w    d2
  971.     bne.b    mt_rtnend
  972. mt_doretrig
  973.     move.w    20(a6),$dff096        ; channel dma off
  974.     move.l    4(a6),(a5)        ; set sampledata pointer
  975.     move.w    8(a6),4(a5)        ; set length
  976.     bsr.w    mt_dmawait
  977.     move.w    20(a6),d0
  978.     or.w    #$8000,d0
  979.     move.w    d0,$dff096
  980.     bsr.w    mt_dmawait
  981.     move.l    10(a6),(a5)
  982.     move.l    14(a6),4(a5)
  983. mt_rtnend
  984.     rts
  985.  
  986. mt_volumefineup
  987.     move.b    mt_counter(pc),d1
  988.     bne.w    mt_return2
  989.     move.b    3(a6),d0
  990.     and.b    d5,d0
  991.     bra.w    mt_volslideup
  992.  
  993. mt_volumefinedown
  994.     move.b    mt_counter(pc),d1
  995.     bne.w    mt_return2
  996.     move.b    3(a6),d0
  997.     and.b    d5,d0
  998.     bra.w    mt_volslidedown2
  999.  
  1000. mt_notecut
  1001.     cmp.b    mt_counter(pc),d0
  1002.     bne.w    mt_return2
  1003.     clr.b    19(a6)
  1004.     clr.w    8(a5)
  1005.     rts
  1006.  
  1007. mt_notedelay
  1008.     move.b    3(a6),d0
  1009.     and.b    d5,d0
  1010.     cmp.b    mt_counter(pc),d0
  1011.     bne.w    mt_return2
  1012.     move.w    (a6),d0
  1013.     beq.w    mt_return2
  1014.     bra.b    mt_doretrig
  1015.  
  1016. mt_patterndelay
  1017.     move.b    mt_counter(pc),d1
  1018.     bne.w    mt_return2
  1019.     move.b    mt_pattdeltime2(pc),d1
  1020.     bne.w    mt_return2
  1021.     move.b    3(a6),d0
  1022.     and.b    d5,d0
  1023.     addq.b    #1,d0
  1024.     move.b    d0,mt_pattdeltime-mt_pm(a2)
  1025.     rts
  1026.  
  1027. mt_funkit
  1028.     move.b    mt_counter(pc),d1
  1029.     bne.w    mt_return2
  1030.     move.b    3(a6),d0
  1031.     and.b    d5,d0
  1032.     lsl.b    #4,d0
  1033.     and.b    d5,31(a6)
  1034.     or.b    d0,31(a6)
  1035.     tst.b    d0
  1036.     beq.w    mt_return2
  1037. mt_updatefunk
  1038.     moveq    #0,d0
  1039.     move.b    31(a6),d0
  1040.     lsr.b    #4,d0
  1041.     beq.b    mt_funkend
  1042.     lea    mt_funktable(pc),a4
  1043.     move.b    (a4,d0.w),d0
  1044.     add.b    d0,35(a6)
  1045.     btst    #7,35(a6)
  1046.     beq.b    mt_funkend
  1047.     clr.b    35(a6)
  1048.  
  1049.     move.l    10(a6),d0
  1050.     moveq    #0,d2
  1051.     move.w    14(a6),d2
  1052.     add.w    d2,d2
  1053.     add.l    d2,d0
  1054.     move.l    36(a6),a4
  1055.     addq.l    #1,a4
  1056.     cmp.l    d0,a4
  1057.     blo.b    mt_funkok
  1058.     move.l    10(a6),a4
  1059. mt_funkok
  1060.     move.l    a4,36(a6)
  1061.     moveq    #-1,d0
  1062.     sub.b    (a4),d0
  1063.     move.b    d0,(a4)
  1064. mt_funkend
  1065.     rts
  1066.  
  1067. mt_dmawait
  1068.     if mt_dmawaiter>0
  1069.     moveq    #mt_dmawaiter-1,d4
  1070. mt_waitdma2
  1071.     move.b    $dff006,d3
  1072. mt_waitdma3
  1073.     cmp.b    $dff006,d3
  1074.     beq.b    mt_waitdma3
  1075.     dbf    d4,mt_waitdma2        ;wait some rasters
  1076.     endc
  1077.     rts
  1078.  
  1079. mt_funktable     dc.b     0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
  1080. mt_vibratotable    dc.b         0, 24, 49, 74, 97,120,141,161
  1081.         dc.b     180,197,212,224,235,244,250,253
  1082.         dc.b     255,253,250,244,235,224,212,197
  1083.         dc.b     180,161,141,120, 97, 74, 49, 24
  1084. mt_periodtable    dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  1085.         dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  1086.         dc.w    214,202,190,180,170,160,151,143,135,127,120,113    ;0
  1087.         dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  1088.         dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  1089.         dc.w    213,201,189,179,169,159,150,142,134,126,119,113    ;1
  1090.         dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  1091.         dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  1092.         dc.w    211,199,188,177,167,158,149,141,133,125,118,112    ;2
  1093.         dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  1094.         dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  1095.         dc.w    209,198,187,176,166,157,148,140,132,125,118,111    ;3
  1096.         dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  1097.         dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  1098.         dc.w    208,196,185,175,165,156,147,139,131,124,117,110    ;4
  1099.         dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  1100.         dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  1101.         dc.w    206,195,184,174,164,155,146,138,130,123,116,109    ;5
  1102.         dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  1103.         dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  1104.         dc.w    205,193,183,172,163,154,145,137,129,122,115,109    ;6
  1105.         dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  1106.         dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  1107.         dc.w    204,192,181,171,161,152,144,136,128,121,114,108    ;7
  1108.         dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  1109.         dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  1110.         dc.w    226,214,202,190,180,170,160,151,143,135,127,120    ;-8
  1111.         dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  1112.         dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  1113.         dc.w    225,212,200,189,179,169,159,150,142,134,126,119 ;-7
  1114.         dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  1115.         dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  1116.         dc.w    223,211,199,188,177,167,158,149,141,133,125,118    ;-6
  1117.         dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  1118.         dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  1119.         dc.w    222,209,198,187,176,166,157,148,140,132,125,118    ;-5
  1120.         dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  1121.         dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  1122.         dc.w    220,208,196,185,175,165,156,147,139,131,123,117    ;-4
  1123.         dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  1124.         dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  1125.         dc.w    219,206,195,184,174,164,155,146,138,130,123,116    ;-3
  1126.         dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  1127.         dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  1128.         dc.w    217,205,193,183,172,163,154,145,137,129,122,115    ;-2
  1129.         dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  1130.         dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  1131.         dc.w    216,203,192,181,171,161,152,144,136,128,121,114    ;-1
  1132. mt_chan1temp    dc.l    0,0,0,0,0,$00010000,0,  0,0,0,0, 0
  1133. mt_chan2temp    dc.l    0,0,0,0,0,$00020000,0,  0,0,0,0, 0
  1134. mt_chan3temp    dc.l    0,0,0,0,0,$00040000,0,  0,0,0,0, 0
  1135. mt_chan4temp    dc.l    0,0,0,0,0,$00080000,0,  0,0,0,0, 0
  1136. mt_samplestarts    dcb.l    31
  1137. mt_speed    dc.b     6
  1138. mt_counter    dc.b     0
  1139. mt_songpos    dc.w     0
  1140. mt_pbreakpos    dc.b     0
  1141. mt_posjumpflag    dc.b     0
  1142. mt_pbreakflag    dc.b     0
  1143. mt_lowmask    dc.b     0
  1144. mt_pattdeltime    dc.b     0
  1145. mt_pattdeltime2    dc.b     0
  1146. mt_maxvol    dc.b    64            ;maximum volume
  1147.         dc.b    0            ;unsed
  1148. mt_patternpos    dc.w     0
  1149. mt_dmacontemp    dc.w     0
  1150. mt_oldirq    dc.l    0
  1151. mt_pm        dcb.w    16
  1152. mt_dataptr    dc.l    mt_data            ;pointer auf sound
  1153.  
  1154.  
  1155.     section "sound",data_c
  1156.  
  1157.         incdir     df0:
  1158. mt_data        incbin    mod.testmodul.pm
  1159.